package org.imlinker.core;

import org.imlinker.gui.MainWindow;
import org.imlinker.gui.TrayIconListener;
import org.imlinker.gui.TrayIconPopup;
import org.imlinker.gui.WindowSaver;
import org.imlinker.list.ListManager;
import org.imlinker.login.Login;
import org.imlinker.plugin.PluginManager;
import org.imlinker.setting.Settings;
import org.imlinker.util.Images;
import org.jivesoftware.smack.XMPPConnection;

/**
 * 核心类，启动各部分资源，以及协调他们之间的配置。
 * 
 */
public class Core extends Thread {

	/**
	 * Core的构造函数，输入参数为程序的最上层目录，即imLinker.jar文件所在文件夹。
	 * 
	 * @param path
	 *            程序最上层目录
	 */
	public Core(String path) {
		this.path = path;

		// 给窗口位置保存和图片资源的两个精通类提供地址，使它们得以找到资源。
		WindowSaver.setPath(path);

		// 构造好MainWindow，主界面。
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				mainWindow = new MainWindow(Core.this);
			}
		});

		// 启动Login线程。
		Login login = new Login(this);
		login.start();
	}

	public void run() {

		// 等待登录成功
		while (connection == null) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		// 登录成功后，立即显示主界面
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				mainWindow.setVisible(true);
			}
		});

		// 初始化个人设置
		String userWithResource = connection.getUser();
		Settings settings = new Settings(path, userWithResource);

		// 初始化插件系统
		PluginManager pluginManager = new PluginManager(settings);

		// 初始化列表管理器
		listManager = new ListManager(connection.getRoster(), pluginManager);
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				mainWindow.setListModel(listManager);
			}
		});

		// 初始化托盘图标
		popup = new TrayIconPopup(mainWindow, settings);
		TrayIconListener trayIconListener = new TrayIconListener(listManager,
				settings, mainWindow);
		popup.getTrayIcon().addMouseListener(trayIconListener);
	}

	public String getPath() {
		return path;
	}

	public void setXMPPConnection(XMPPConnection connection) {
		this.connection = connection;
	}

	public void setVisible(boolean b) {
		mainWindow.setVisible(b);
	}

	public void setMessageNum(int number) {
		popup.setMessageNum(number);
		mainWindow.setMessageNum(number);
	}

	private MainWindow mainWindow;

	private XMPPConnection connection;

	private String path;

	private ListManager listManager;

	private TrayIconPopup popup;

}
